// utils/cloudRequest.js
// 云函数请求封装工具

const app = getApp();

/**
 * 调用共享云函数
 * @param {string} functionName - 云函数名称
 * @param {object} data - 传递的数据
 * @returns {Promise} 返回云函数调用结果
 */
async function callSharedFunction(functionName, data = {}) {
  try {
    // 等待共享云开发环境初始化完成
    await app.waitForSharedCloudReady();

    if (!app.globalData.sharedCloud) {
      throw new Error("共享云开发环境未初始化");
    }

    const result = await app.globalData.sharedCloud.callFunction({
      name: functionName,
      data: data,
    });

    console.log(`共享云函数 ${functionName} 集合 ${data.gather} 调用成功:`, result);
    return result;
  } catch (error) {
    console.error(`共享云函数 ${functionName} 调用失败:`, error);
    // 显示错误提示
    wx.showToast({
      title: "获取数据失败",
      icon: "none",
    });
    throw error;
  }
}

/**
 * 通用数据获取方法
 * @param {object} data - 配置选项
 * @param {object} data.gather - 集合名称，必填
 * @param {object} data.page - 页码，默认1
 * @param {object} data.pageSize - 每页数量，默认20，pageSize和size二选一
 * @returns {Promise} 返回数据
 */
async function getCloudFunctionData(data = {}) {
  try {
    const res = await callSharedFunction("getData", data);
    if (res && res.result) {
      return res.result;
    } else {
      // console.warn(`获取 ${functionName} 数据为空或格式不正确:`, res.result);
      return {};
    }
  } catch (error) {
    // console.error(`获取 ${functionName} 数据失败:`, error);
    throw error;
  }
}

/**
 * 通用数据详情
 * @param {object} data - 配置选项
 * @param {object} data.gather - 集合名称，必填
 * @param {object} data.page - 页码，默认1
 * @param {object} data.pageSize - 每页数量，默认20，pageSize和size二选一
 * @returns {Promise} 返回数据
 */
async function getCloudFunctionDataDetail(data = {}) {
  try {
    const res = await callSharedFunction("oneData", data);
    if (res && res.result) {
      return res.result;
    } else {
      // console.warn(`获取 ${functionName} 数据为空或格式不正确:`, res.result);
      return {};
    }
  } catch (error) {
    // console.error(`获取 ${functionName} 数据失败:`, error);
    throw error;
  }
}

/**
 * 带错误处理和备用方案的请求方法
 * @param {Function} requestFn - 主要请求函数
 * @param {Function} fallbackFn - 备用请求函数
 * @param {object} options - 配置选项
 * @returns {Promise} 返回请求结果
 */
async function requestWithFallback(requestFn, fallbackFn, options = {}) {
  try {
    // 尝试主要请求方法
    const result = await requestFn(options);
    return result;
  } catch (error) {
    console.log("主要请求方法失败，尝试备用方法:", error);

    try {
      // 尝试备用请求方法
      const result = await fallbackFn(options);
      return result;
    } catch (fallbackError) {
      console.error("备用方法也失败:", fallbackError);
      throw fallbackError;
    }
  }
}

module.exports = {
  callSharedFunction,
  getCloudFunctionData,
  getCloudFunctionDataDetail,
  requestWithFallback,
};